E-초기화 컨테이너보다 앞서는 사이드카 컨테이너
개요
사이드카 컨테이너는 초기화 컨테이너의 일부라는 것을 명확히 하고 들어가도록 한다.
그래서 순서가 보장된다고 하는데, 기본적으로 초기화 컨테이너에서 순서는 이전 컨테이너의 실행 완료를 보장한다는 뜻이기도 하다.
그런데 사이드카 컨테이너는 기본이 앱 컨테이너와 함께 계속 같이 실행되는 것이 전제되는데, 그럼 사이드카 컨테이너 이후에 존재하는 일반 초기화 컨테이너는 어떻게 동작하는 걸까?
무한 대기 사이드카 컨테이너
containers:
- name: sidecar
image: alpine:latest
command: ['sh', '-c', 'while true; do echo "logging" >> /opt/logs.txt; sleep 1; done']
ports:
- containerPort: 80
name: http
volumeMounts:
- name: data
mountPath: /opt
initContainers:
- name: logshipper
image: alpine:latest
restartPolicy: Always
command: ['sh', '-c', 'tail -F /opt/logs.txt']
volumeMounts:
- name: data
mountPath: /opt
- name: after-sidecar
image: alpine:latest
command: ['sh' , '-c' , "sleep 5"]
volumes:
- name: data
emptyDir: {}
처음 옵션은 이렇게 주었다.
분명하게 순서를 지키는 모습이 확인된다.
사이드카는 계속 돌아가는데 이후 초기화 컨테이너가 알아서 시작하는 과정을 거친다.
종료되는 사이드카라면?
그러면 에러든 성공이든, 종료가 되어버리는 사이드카가 앞에 있다면 무슨 일이 일어날까?
이번에는 그냥 15초를 기다리게 만들었다.
이번에도 순서를 잘 반영해서 실행되었다.
init 조건이 전부 충족되어 running 상태가 되었는데, 15초가 지나자 컨테이너는 종료됐고 그 동안 파드는 준비 상태가 아니게 됐다.
그러고보니 인식하지 못 했는데, READY에는 앱 컨테이너와 사이드카 컨테이너의 두 상태를 보는 듯하다.
사이드카 컨테이너가 재시작된다고 해서 초기화 컨테이너가 재시작되지는 않았다.
초기화가 시작되기 전에 종료되는 사이드카라면?
그러면 순서 자체는 명시된 대로 보장되고, 이외에 이후 초기화 컨테이너에 영향이 가는 것은 없을까?
1초만 지나면 사이드카는 꺼진다.
그리고 초기화 컨테이너는 새로운 이미지를 받아야해서 실행되는데 시간이 걸린다.
참고로 이미 초기화 컨테이너가 실행되는 중에 발생하는 사이드카 컨테이너의 종료는 아무런 영향이 없었다.
이것 역시 결론은 마찬가지.
초기화 컨테이너는 그냥 지 알아서 할 것 한다.
딱 순서만 보장되는 것 이외에는 둘은 서로 상관이 없는 것 같다.
그럼.. 실패하는 사이드카라면?
실패 여부가 영향이 있을 수도 있을까?
command: ['sh', '-c', 'exit 1']
별 거 없이 무조건 실패만 시킨다.
엇.. 이번에는 뒤의 초기화 컨테이너도 실행되지 않는다.
초기화가 시작되기 이전에 문제가 발생해서?
그래서 이번에는 5초 정도 유예를 준 후 에러를 유발시켰다.
그러자 결국 뒤의 초기화 컨테이너는 실행됐다.
재밌는 건, 그래서 앱 컨테이너도 결국 돌아가기 시작하긴 했다는 것이다.
그 후로 사이드카가 죽으면 Init:CrashLoopBackOff
가 발생하고 있다.
아까랑 종료 코드가 다른 것인데 나오는 문구가 달라졌다.
사실 뜨기로는 성공 종료되는 이전 실험에서도 크룹백이 떴어야 하는 것이 아닌가 싶은데, 그때는 그냥 Running
이었단 말이지.
결론
- 모든 초기화 컨테이너는 순서가 보장된다.
- 하물며 사이드카 컨테이너조차 그렇다.
- 사이드카 컨테이너는 이후에 실행되는 초기화 컨테이너에 웬만해서 영향을 주지 않는다.
- 초기화 컨테이너가 시작되기 이전 사이드카에서 실패 종료를 할 때는 영향을 준다.
- 사이드카 컨테이너가 실패 종료를 할 때와 성공 종료를 할 때의 표시가 다르다.
- 실패는 Init: Error가 뜨고, 성공은 그냥 Running이라고 뜬다.
- 근데 그냥 표시만 다른 거지 결국 동작은 똑같이 일어나는 듯..